﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using itau.im.relatorios.entidade;
using EnterpriseLibraryWrapper;
using System.Data;

namespace itau.im.relatorios.dado
{
    public class RelatorioRegraDB : IRelatorioRegraDAO
    {
        public IList<Situacao> ObterSituacoesRegra()
        {
            List<Situacao> retorno = new List<Situacao>();

            retorno.Add(new Situacao()
            {
                codigo = 1,
                NomeSituacao = "Habilitada"
            });

            retorno.Add(new Situacao()
            {
                codigo = 2,
                NomeSituacao = "Desabilitada"
            });

            return retorno;
        }

        public IList<RegraAtribuicaoCurva> ObterRegrasAtribuicaoCurvaVigentesPorCodigoGrupo(int codigoGrupo)
        {
            //Declaração dos objetos
            IDataAccessWrapper data = null;
            List<RegraAtribuicaoCurva> lista = new List<RegraAtribuicaoCurva>();
            DataSet ds;

            try
            {
                //Recupera o objeto de acesso a dados
                data = EnterpriseLibraryFactory.GetDataAccess();

                data.ParameterIn.Add(new ParameterInWrapper("@COD_GRUP_PARM_ATR", codigoGrupo, DbType.Int32));

                ds = data.ExecuteDataSet("DB2IM.IMS5C");

                //Verifica se o retorno é válido
                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    //Percorre todos os registros da tabela
                    foreach (DataRow linha in ds.Tables[0].Rows)
                    {
                        //Monta e adiciona o objeto na lista
                        lista.Add(EntidadeFactory.getRegraAtribuicaoCurva(linha));
                    }
                }

                //Retorna a consulta
                return lista;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            finally
            {
                //Desaloca os objetos
                data.Dispose();
                data = null;
                ds = null;
                lista = null;
            }

            //Retorna a consulta
            return new List<RegraAtribuicaoCurva>();
        }

        public IList<RegraAtribuicaoCurva> ObterRegrasAtribuicaoCurvaPorCodigoGrupoData(int codigoGrupo, DateTime dataInicio, DateTime dataFim)
        {
            //Declaração dos objetos
            IDataAccessWrapper data = null;
            List<RegraAtribuicaoCurva> lista = new List<RegraAtribuicaoCurva>();
            DataSet ds;

            try
            {
                //Recupera o objeto de acesso a dados
                data = EnterpriseLibraryFactory.GetDataAccess();

                dataFim = dataFim.Date.AddDays(1).AddMilliseconds(-1);

                data.ParameterIn.Add(new ParameterInWrapper("@COD_GRUP_PARM_ATR", codigoGrupo, DbType.Int32));
                data.ParameterIn.Add(new ParameterInWrapper("@DAT_INICIO", dataInicio, DbType.DateTime));
                data.ParameterIn.Add(new ParameterInWrapper("@DAT_FIM", dataFim, DbType.DateTime));

                ds = data.ExecuteDataSet("DB2IM.IM0S8L");

                //Verifica se o retorno é válido
                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    //Percorre todos os registros da tabela
                    foreach (DataRow linha in ds.Tables[0].Rows)
                    {
                        //Monta e adiciona o objeto na lista
                        lista.Add(EntidadeFactory.getRegraAtribuicaoCurva(linha));
                    }
                }

                //Retorna a consulta
                return lista;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            finally
            {
                //Desaloca os objetos
                data.Dispose();
                data = null;
                ds = null;
                lista = null;
            }

            //Retorna a consulta
            return new List<RegraAtribuicaoCurva>();
        }

        public IList<UsuarioAlteracao> ObterUsuarios()
        {
            IDataAccessWrapper data = null;
            List<UsuarioAlteracao> usuarios = null;
            DataSet ds;
            string _siglaSistema = "STP";

            try
            {
                usuarios = new List<UsuarioAlteracao>();
                data = EnterpriseLibraryFactory.GetDataAccess();

                //AdminReference.ControleAcessoAdminServiceClient _client = new AdminReference.ControleAcessoAdminServiceClient();
                //foreach (AdminReference.Perfil perfil in this._client.SelecionarPerfisPorSistema(_siglaSistema))
                //{
                //    foreach (AdminReference.Usuario usuario in this._client.SelecionarUsuariosPorPerfil(perfil.Id))
                //    {
                //         UsuarioAlteracao newUser = new UsuarioAlteracao();
                //         newUser.codigo = usuario.Codigo;
                //         newUser.NomeUsuario = usuario.Nome;

                //         if (!usuarios.Contains(newUser))
                //         {
                //             usuarios.Add(newUser);
                //         }
                //    }
                //}

                return usuarios;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            finally
            {
                //data.Dispose();
                //data = null;
            }

            return null;
        }

        public IList<RegraAtribuicaoCurva> ObterRegrasAtribuicaoCurvaPorUsuarioEDataAlteracao(string codigoUsuarioAlteracao, DateTime dataAlteracao)
        {
            //Declaração dos objetos
            IDataAccessWrapper data = null;
            List<RegraAtribuicaoCurva> lista = new List<RegraAtribuicaoCurva>();
            DataSet ds;

            try
            {
                data = EnterpriseLibraryFactory.GetDataAccess();

                DateTime dataAlteracaoFim = dataAlteracao.AddDays(1).AddMilliseconds(-1);

                data.ParameterIn.Add(new ParameterInWrapper("@WCOD_USUA_ALTE", codigoUsuarioAlteracao.ToLower(), DbType.String));
                data.ParameterIn.Add(new ParameterInWrapper("@WDAT_HOR_ALTE_INI", dataAlteracao, DbType.DateTime));
                data.ParameterIn.Add(new ParameterInWrapper("@WDAT_HOR_ALTE_FIM", dataAlteracaoFim, DbType.DateTime));

                ds = data.ExecuteDataSet("DB2IM.IM0S8M");

                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    foreach (DataRow linha in ds.Tables[0].Rows)
                    {
                        lista.Add(EntidadeFactory.getRegraAtribuicaoCurva(linha));
                    }
                }

                return lista;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            finally
            {
                //Desaloca os objetos
                data.Dispose();
                data = null;
                ds = null;
                lista = null;
            }

            //Retorna a consulta
            return new List<RegraAtribuicaoCurva>();
        }
    }
}
